/**
 * 构建tree结构数据
 * @param data
 * @param opt
 * @returns {*}
 */
function buildTreeData(data, opt = {}) {
    if (!Array.isArray(data)) {
        throw new Error('buildTreeData：data类型不符');
    }
    opt = Object.assign({
        keyField: 'id',           //标识列
        textField: 'label',        //名称列
        parentKey: 'parentId',    //父列名
        rootParentId: 0
    }, opt);
    return selectSon(opt.rootParentId, 1);

    function selectSon(parentId, depth) {
        const result = data.filter(function (item) {
            return item[opt.parentKey] === parentId;
        });
        if (result.length === 0) {
            return result;
        }
        result.forEach(function (item, index) {
            item.id = item[opt.keyField];                   // id
            item.label = item[opt.textField];                // 节点文本
            item.parentId = item[opt.parentKey];            // 上级节点id
            item.children = selectSon(item[opt.keyField], depth + 1);  // 下级节点
            item.checked = item.checked || false;  // 是否选中
            item.disabled = item.disabled || false;// 禁止选择
            item.isLeaf = item.children.length === 0;
            item.depth = depth;
            item.$index = index;
        });
        return result;
    }
}


class TreeData {

    constructor(opt) {
        this.data = [];     //树形数据
        this.allNode = [];  //所有节点数据
        this.opt = opt;
    }

    /**
     * 加载数据
     * @param data
     */
    init(data) {
        this.allNode = data;
        this.data = buildTreeData(data, this.opt);
    }

    /**
     * 从子节点追溯其根节点
     */
    getRootNode(id) {
        let node = this.allNode.find((item) => {
            return item.id === id;
        });

        while (node.parentId > 0) {
            node = this.allNode.find((item) => {
                return item.id === node.parentId;
            });
        }
        return node;
    }


    /**
     * 获取节点的所有父节点
     */
    getParentsNode(id) {
        let result = [], node = this.allNode.find((item) => {
            return item.id === id;
        });

        while (node.parentId > 0) {
            node = this.allNode.find((item) => {
                return item.id === node.parentId;
            });
            result.push(node);
        }
        result.reverse();
        return result;
    }

    /**
     * 通过id检索指定的节点
     * @param id
     * @returns {T}
     */
    getNode(id) {
        return this.allNode.find(function (item) {
            return item.id === id;
        });
    }
}

export {
    TreeData,
    buildTreeData
}
